#pragma once

#include "vehicle_service.h"
#include "kernel/interfaces/IConfiguration.h"
#include "kernel/interfaces/ILogger.h"
#include "infrastructure/services/common_service.h"
#include <memory>

namespace application {

namespace simulation {
    class SimulationService;
}

namespace vehicle {

/**
 * @brief 车辆初始化器
 * @details 根据配置文件初始化不同类型的 AGV (SEER/MKLM/Simulation)
 */
class VehicleInitializer {
public:
    /**
     * @brief 构造函数
     * @param commonService 通用服务
     * @param vehicleService 车辆服务
     */
    VehicleInitializer(
        std::shared_ptr<infrastructure::services::CommonService> commonService,
        std::shared_ptr<VehicleService> vehicleService
    );

    /**
     * @brief 设置仿真服务（可选）
     */
    void setSimulationService(std::shared_ptr<simulation::SimulationService> simulationService);

    /**
     * @brief 从配置文件初始化所有车辆
     * @return bool 是否成功
     */
    bool initializeVehiclesFromConfig();

private:
    std::shared_ptr<infrastructure::services::CommonService> m_commonService;
    std::shared_ptr<VehicleService> m_vehicleService;
    std::shared_ptr<simulation::SimulationService> m_simulationService;
    std::shared_ptr<kernel::ILogger> m_logger;

    /**
     * @brief 初始化单个 SEER AGV
     * @param agvNumber AGV 编号
     * @param ip IP 地址
     * @param pollInterval 轮询间隔（毫秒）
     * @return bool 是否成功
     */
    bool initializeSeerAgv(int agvNumber, const QString& ip, int pollInterval);

    /**
     * @brief 初始化仿真车辆
     * @return int 成功初始化的数量
     */
    int initializeSimulationVehicles();

    /**
     * @brief 初始化单个仿真车辆
     * @param agvNumber AGV 编号
     * @param name 车辆名称
     * @param initialStation 初始站点
     * @param initialMap 初始地图
     * @return bool 是否成功
     */
    bool initializeSimulationAgv(
        int agvNumber,
        const QString& name,
        const QString& initialStation,
        const QString& initialMap,
        int initialBatteryPercent
    );
};

} // namespace vehicle
} // namespace application
